package admin

import (
	"baokaobang/datasourse"
	"baokaobang/models"
	"baokaobang/utils"
	"encoding/json"
	"fmt"
	"github.com/kataras/iris/v12"
	"github.com/kataras/iris/v12/mvc"
)

type Label struct {
	Ctx iris.Context
}

type LabelCreate struct {
	Id    string `json:"id"`
	Name  string `json:"name"`
	MType int    `json:"type"`
}

type LabelListParam struct {
	PerPage int `json:"perPage"`
	CurPage int `json:"curPage"`
}

func (c *Label) OptionsAll() mvc.Result {
	return mvc.Response{
		Code: 204,
	}
}

// 获取所有标签
func (c *Label) PostAll() interface{} {
	db, err := datasourse.NewMasterOrm()
	if err != nil {
		return utils.CommonRes(1000, fmt.Sprintf("无法连接数据库：%s", err.Error()), "")
	}

	labelList := make([]models.Label, 0)
	err = db.Find(&labelList)
	if err != nil {
		return utils.CommonRes(1000, fmt.Sprintf("无法获取所有标签：%s", err.Error()), "")
	}

	return utils.CommonRes(20000, "成功获取所有标签", labelList)
}

func (c *Label) OptionsShow() mvc.Result {
	return mvc.Response{
		Code: 204,
	}
}

// 获取展示标签
func (c *Label) PostShow() interface{} {
	db, err := datasourse.NewMasterOrm()
	if err != nil {
		return utils.CommonRes(1000, fmt.Sprintf("无法连接数据库：%s", err.Error()), "")
	}

	labelList := make([]models.Label, 0)
	err = db.Where("`m_type` > 1").Find(&labelList)
	if err != nil {
		return utils.CommonRes(1000, fmt.Sprintf("无法获取展示标签：%s", err.Error()), "")
	}

	return utils.CommonRes(20000, "成功获取展示标签", labelList)
}

func (c *Label) OptionsMatch() mvc.Result {
	return mvc.Response{
		Code: 204,
	}
}

// 获取展示标签
func (c *Label) PostMatch() interface{} {
	db, err := datasourse.NewMasterOrm()
	if err != nil {
		return utils.CommonRes(1000, fmt.Sprintf("无法连接数据库：%s", err.Error()), "")
	}

	labelList := make([]models.Label, 0)
	err = db.Where("`m_type` = 1").Find(&labelList)
	if err != nil {
		return utils.CommonRes(1000, fmt.Sprintf("无法获取展示标签：%s", err.Error()), "")
	}

	return utils.CommonRes(20000, "成功获取展示标签", labelList)
}

func (c *Label) OptionsCreate() mvc.Result {
	return mvc.Response{
		Code: 204,
	}
}

// 创建标签
func (c *Label) PostCreate() interface{} {
	labelCreate := LabelCreate{}
	content, err := c.Ctx.GetBody()
	if err != nil {
		return utils.CommonRes(1000, fmt.Sprintf("接收请求参数出错：%s", err.Error()), "")
	}
	err = json.Unmarshal(content, &labelCreate)
	if err != nil {
		return utils.CommonRes(1000, fmt.Sprintf("解析请求参数出错：%s", err.Error()), "")
	}

	if len(labelCreate.Name) <= 0 {
		return utils.CommonRes(1000, "请输入标签名称", "")
	}

	db, err := datasourse.NewMasterOrm()
	if err != nil {
		return utils.CommonRes(1000, fmt.Sprintf("无法连接数据库：%s", err.Error()), "")
	}

	label := new(models.Label)
	label.Name = labelCreate.Name
	label.MType = labelCreate.MType

	_, err = db.InsertOne(label)
	if err != nil {
		return utils.CommonRes(1000, fmt.Sprintf("操作失败：%s", err.Error()), "")
	}

	return utils.CommonRes(20000, "操作成功", "")
}

func (c *Label) OptionsDetail() mvc.Result {
	return mvc.Response{
		Code: 204,
	}
}

// 获取标签详情
func (c *Label) PostDetail() interface{} {
	editParam := utils.EditParam{}
	content, err := c.Ctx.GetBody()
	if err != nil {
		return utils.CommonRes(1000, fmt.Sprintf("接收请求参数出错：%s", err.Error()), "")
	}
	err = json.Unmarshal(content, &editParam)
	if err != nil {
		return utils.CommonRes(1000, fmt.Sprintf("解析请求参数出错：%s", err.Error()), "")
	}

	if len(editParam.Id) <= 0 {
		return utils.CommonRes(1000, "请提供标签id", "")
	}

	db, err := datasourse.NewMasterOrm()
	if err != nil {
		return utils.CommonRes(1000, fmt.Sprintf("无法连接数据库：%s", err.Error()), "")
	}

	label := new(models.Label)
	ok, err := db.ID(editParam.Id).Get(label)
	if err != nil {
		return utils.CommonRes(1000, fmt.Sprintf("信息获取失败：%s", err.Error()), "")
	}
	if !ok {
		return utils.CommonRes(1000, "信息获取失败", "")
	}

	return utils.CommonRes(20000, "信息获取成功", label)
}

func (c *Label) OptionsEdit() mvc.Result {
	return mvc.Response{
		Code: 204,
	}
}

// 修改标签
func (c *Label) PostEdit() interface{} {
	labelCreate := LabelCreate{}
	content, err := c.Ctx.GetBody()
	if err != nil {
		return utils.CommonRes(1000, fmt.Sprintf("接收请求参数出错：%s", err.Error()), "")
	}
	err = json.Unmarshal(content, &labelCreate)
	if err != nil {
		return utils.CommonRes(1000, fmt.Sprintf("解析请求参数出错：%s", err.Error()), "")
	}

	if len(labelCreate.Id) <= 0 {
		return utils.CommonRes(1000, "请提供标签id", "")
	}
	if len(labelCreate.Name) <= 0 {
		return utils.CommonRes(1000, "请输入标签名", "")
	}

	db, err := datasourse.NewMasterOrm()
	if err != nil {
		return utils.CommonRes(1000, fmt.Sprintf("无法连接数据库：%s", err.Error()), "")
	}

	updateData := map[string]interface{}{
		"name": labelCreate.Name,
		"m_type": labelCreate.MType,
	}
	_, err = db.Table(new(models.Label)).ID(labelCreate.Id).Update(updateData)
	if err != nil {
		return utils.CommonRes(1000, fmt.Sprintf("操作失败：%s", err.Error()), "")
	}

	return utils.CommonRes(20000, "操作成功", "")
}

func (c *Label) OptionsList() mvc.Response {
	return mvc.Response{
		Code: 204,
	}
}

// 获取标签列表
func (c *Label) PostList() interface{} {
	labelListParam := LabelListParam{}
	content, err := c.Ctx.GetBody()
	if err != nil {
		return utils.CommonRes(1000, fmt.Sprintf("接收请求参数出错：%s", err.Error()), "")
	}
	err = json.Unmarshal(content, &labelListParam)
	if err != nil {
		return utils.CommonRes(1000, fmt.Sprintf("解析请求参数出错：%s", err.Error()), "")
	}

	db, err := datasourse.NewMasterOrm()
	if err != nil {
		return utils.CommonRes(1000, "无法连接服务器", "")
	}

	labelList := make([]models.Label, 0)
	start := (labelListParam.CurPage - 1) * labelListParam.PerPage
	err = db.Limit(labelListParam.PerPage, start).Find(&labelList)
	if err != nil {
		return utils.CommonRes(1000, fmt.Sprintf("无法获取标签列表：%s", err.Error()), "")
	}

	total, err := db.Where("id > ?", 0).Count(new(models.Label))
	if err != nil {
		return utils.CommonRes(1000, fmt.Sprintf("无法获取标签列表：%s", err.Error()), "")
	}

	for i, label := range labelList {
		labelList[i].TypeShow = models.LabelType[label.MType]
	}

	data := map[string]interface{}{
		"total": total,
		"list":  labelList,
	}

	return utils.CommonRes(20000, "成功获取标签列表", data)
}
